package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 聊天室服务端
 */

public class Server {
    /*
    运行在服务端的ServerSocket主要有两个作用
    1:向系统申请服务端,客户端的Socket就是通过这个端口与服务端建立连接的
    2:监听服务端口,一旦一个客户端通过该端口建立连接会自动创建一个Socket,服务端
    就可以通过这个Socket与客户端交互了

    如果我们把Socket比喻为电话,那么ServerSocket相当于是某客服中心的总机
     */
    private ServerSocket serverSocket;

    public Server() {
        try {
            System.out.println("正在启动服务端...");
        /*
        实例化是要指定服务端口,如果该端口被当前系统其他应用程序占领时,会
        抛出异常:java.net.BlindException:address already in use
         */
            serverSocket = new ServerSocket(8088);
            System.out.println("服务端启动完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
        public void start(){
     try {
    /*
    ServerSocket提供的方法:
    Socket accept()
    该方法是一个阻塞方法,调用后程序进入阻塞状态("卡住"),直到一个客户端
    实例化Socket与当前客户端建立连接,此时accept方法会立即返回一个Socket
    实例,服务端通过它就可以与客户端交互了.
    可以理解为这个动作相当于是总机的"接电话"操作
     */
         System.out.println("等待客户端连接...");
         Socket socket=serverSocket.accept();
         System.out.println("与一个客户连接");
         InputStream in=socket.getInputStream();
         InputStreamReader isr=new InputStreamReader(in,"UTF-8");
         BufferedReader br=new BufferedReader(isr);

         String line=br.readLine();
         System.out.println("服务端说:"+line);
}catch(IOException e){
    e.printStackTrace();
     }
    }
        public static void main (String[]args){
            Server server = new Server();
            server.start();
        }
    }
